n = 4830459  # 23333333333333*0.5+1
pri = []  # 用于存储筛选出的质数的列表
not_prime = [False] * 10**7  # 长度为 10 的 7 次方的布尔类型列表，用于标记每个数是否为质数，False 表示可能是质数，True 表示不是质数

# 欧拉筛 ，线性筛
def pre(n):
    for i in range(2, n):  # 从 2 到 n - 1 遍历每个数
        if not not_prime[i]:  # 如果当前数 i 没有被标记为非质数
            pri.append(i)  # 将 i 添加到质数列表 pri 中
        for pri_j in pri:  # 遍历已经找到的质数列表 pri
            if i * pri_j > n:  # 如果 i 与当前质数 pri_j 的乘积大于 n，则跳出内层循环，因为后续乘积会更大，不需要再判断
                break
            not_prime[i * pri_j] = True  # 将 i 与 pri_j 的乘积标记为非质数
            if i % pri_j == 0:  # 如果 i 能被 pri_j 整除
                """
                i % pri_j == 0
                换言之，i 之前被 pri_j 筛过了
                由于 pri 里面质数是从小到大的，所以 i 乘上其他的质数的结果一定会被
                pri_j 的倍数筛掉，就不需要在这里先筛一次，所以这里直接 break
                掉就好了
                """
                break  # 跳出内层循环，不再继续用 i 去筛其他数

pre(n)  # 调用 pre 函数进行质数筛选
lenth = len(pri)  # 获取筛选出的质数列表的长度
ans = 0  # 用于统计满足条件的数的个数，初始化为 0
for i in range(lenth):  # 外层循环，遍历质数列表
    for j in range(i + 1, lenth):  # 内层循环，从 i + 1 开始遍历质数列表，保证不重复计算
        cur = (pri[i] ** 2) * (pri[j] ** 2)  # 计算当前两个质数平方的乘积
        if cur > 23333333333333:  # 如果当前乘积大于 23333333333333，则跳出内层循环，因为后续乘积会更大
            break
        if 2333 <= (pri[i] ** 2) * (pri[j] ** 2) <= 23333333333333:  # 如果当前乘积在 2333 到 23333333333333 之间
            ans += 1  # 满足条件的数的个数加 1
print(ans)  # 输出满足条件的数的个数
